home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
modula.arc
/
LIST.MOD
< prev
next >
Wrap
Text File
|
1985-05-30
|
2KB
|
67 lines
(* A procedure "search" is to locate records with a given key
in an ordered list. If the key is not present, then a new
record is to be inserted so that the ordering of keys is
maintained. Use a sentinel at the end of the list. *)
MODULE list;
FROM InOut IMPORT Write, WriteLn, WriteString, ReadCard, WriteCard;
FROM Storage IMPORT ALLOCATE;
TYPE ref = POINTER TO word;
word = RECORD
key: CARDINAL;
count:CARDINAL;
next: ref
END;
VAR k: CARDINAL;
root,sentinel: ref;
PROCEDURE search(x: CARDINAL; VAR root: ref);
VAR w1,w2,w3: ref;
BEGIN
w2 := root;
w1 := w2^.next;
sentinel^.key := x;
WHILE w1^.key < x DO
w2 := w1;
w1 := w2^.next
END;
IF (w1^.key = x) AND (w1 # sentinel) THEN
INC(w1^.count);
ELSE
NEW(w3); (* insert w3 between w1 and w2 *)
WITH w3^ DO
key := x;
count := 1;
next := w1
END;
w2^.next := w3
END
END search;
PROCEDURE printlist(w,z: ref);
BEGIN
WriteString(' Key Count');
WriteLn;
WHILE w # z DO
WriteCard(w^.key,6);
WriteCard(w^.count,6);
w := w^.next; WriteLn
END
END printlist;
BEGIN
NEW(root); NEW(sentinel);
root^.next := sentinel;
LOOP
WriteString(' Enter k> ');
ReadCard(k); WriteLn;
IF k = 0 THEN EXIT END;
search(k,root);
END;
printlist(root^.next,sentinel)
END list.